package com.ssky.bean.validator.core.checker;

import com.ssky.bean.validator.core.IValidatorContext;
import com.ssky.bean.validator.core.ValueExp;
import org.apache.commons.lang3.StringUtils;

/**
 * <li/>针对所有类型对象校验； 如果校验的目标值是注入的常量，则会调用toString()方法得到字符串值再进行校验
 *
 * @param <V>
 * @param <L>
 * @param <B>
 * @author ssky
 */
public class EqualsChecker<V, L, B> extends AbstractChecker<V, L, B> {


    /**
     * <li/>set
     * 支持常量、取值表达式；不支持算术表达式
     */
    private String data;


    /**
     * 比较的目标数据表达式
     * <li/>支持常量、取值表达式；不支持算术表达式
     * c--> constant:常量
     * s--> ${$this}:当前属性自己的值
     * t--> ${$this. }:当前值的其他属性（单级）
     * l--> ${$local. }:属性所属对象的其他属性取值（单级）
     * b--> ${$bean. }:所属最外层对象的全路径属性取值（多级）
     */
    private ValueExp dataExp;

    private Object dataConstant;

    @Override
    void initz() throws Exception {
        dataExp = ValueExp.genValueExp(data);

        if (dataExp.isConstant()) {
            String vvString = dataExp.vExp;
            if (StringUtils.isBlank(vvString)) {
                return;
            }
            Class classType = field.getClassType();
            if (String.class == classType) {
                this.dataConstant = vvString;
            } else if (Boolean.class == classType) {
                this.dataConstant = Boolean.getBoolean(vvString);
            } else if (Character.class == classType) {
                this.dataConstant = Character.valueOf(vvString.charAt(0));
            } else if (Byte.class == classType) {
                this.dataConstant = Byte.valueOf(vvString);
            } else if (Short.class == classType) {
                this.dataConstant = Short.valueOf(vvString);
            } else if (Integer.class == classType) {
                this.dataConstant = Integer.valueOf(vvString);
            } else if (Long.class == classType) {
                this.dataConstant = Long.valueOf(vvString);
            } else if (Double.class == classType) {
                this.dataConstant = Double.valueOf(vvString);
            } else if (Float.class == classType) {
                this.dataConstant = Float.valueOf(vvString);
            }
        }
    }

    /**
     * 具体规则执行器
     *
     * @param v   规则校验的当前值
     * @param l   当前值作为属性的所在对象
     * @param b   当前值所在的顶级javaBean对象
     * @param ctx 上下文（针对具体规则的实现要求，可基于接口IValidatorContext扩展）
     * @return 校验通过返回true, 不通过返回false
     */
    @Override
    public boolean process(V v, L l, B b, IValidatorContext ctx) {
        if (v == null) {
            return true;
        }
        boolean rst = false;
        if (dataExp.isConstant()) {
            rst = v.toString().equals(dataConstant);
        } else {
            Object tag = fieldValueGetHandler.getExpVaule(dataExp, v, l, b, ctx);
            rst = v.equals(tag);
        }
        return rst;
    }


    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public ValueExp getDataExp() {
        return dataExp;
    }
}
